Grafica con Real 3D


Fuoco e fiamme con Real 3D

Ecco un tutorial per piromani: come ottenere una realistica simulazione tridimensionale di fuoco, fiamme, incendi, pire ed esplosioni.

REAL 3D

di Alessandro Tasora (tasora@galactica.it)

E' successo sicuramente anche a voi, se siete chitarristi autodidatti: dopo mesi e mesi di pratica estendete il vostro repertorio in modo da comprendere decine di milioni di canzoni, litanie tibetane e cori alpini inclusi, ma al momento in cui finalmente potete far sfoggio della vostra abilità strumentale, magari seduti in spiaggia con lo scopo di far colpo sulle ragazze straniere, ecco che subito salta fuori il simpatico di turno che chiede l'unico pezzo che non avete studiato. E più insistete a proporre alternative, più si intestardisce il vostro interlocutore: "ma come, non sai la sigla di Mazinga Zeta? Allora non sai proprio suonare!" Ovviamente non serve a nulla proporre in alternativa virtuosismi di Eric Clapton o brani di Mozart: ormai tutta la spiaggia sa che siete chitarristi falliti, perché non conoscete la sigla di Mazinga Zeta o dell'Ape Maia. Ebbene, la stessa cosa capita anche se siete videografici o professionisti della grafica 3D: prima o poi succede che arrivi un cliente nel vostro studio e vi chieda un particolare tipo di effetto tridimensionale che è notoriamente difficile da simulare: il fuoco. Infatti è risaputo che anche gli appassionati di grafica 3D alle prime armi hanno confidenza con la simulazione di acqua, vetri e superfici solide, ma il fuoco rimane sempre la "bestia nera" di tutti gli elementi. La soluzione più immediata e scontata per la simulazione di falò ed incendi vari, consiste nell'applicazione di un'apposita texture procedurale ad un piano verticale (molto utili sono a questo scopo le texture della collezione "Essence" di Steve Worley). In tal caso la texture provvede a "ritagliare" il piano di applicazione per dargli una sagoma frastagliata, e allo stesso tempo gli conferisce un colore brillante, variabile dal giallo al rosso (osservate che non è indispensabile disporre di texture procedurali vere e proprie per ottenere quest'effetto, infatti si può ottenere come combinazione di due brush mapping: uno per la trasparenza ed uno per il colore). Tuttavia noi non prenderemo in combinazione questa soluzione dal momento che non consente una vera rappresentazione tridimensionale del fuoco (difatti le fiamme non possono essere inquadrate di profilo perché paleserebbero la loro natura di "proiezioni" su di un piano), né tantomeno è possibile viaggiare al loro interno con la telecamera virtuale. Cerchiamo allora una soluzione alternativa, traendo spunto dal sistema particellare impiegato da Alias-Wavefront, ed implementando il tutto sul nostro versatile Real 3D.

Come muovere le particelle?

Prima di iniziare a trattare la modellazione dei nostri falò, va precisato che la generazione dei getti di particelle è stato da noi ottenuta mediante la plug-in PHENOMENA 1.36 beta, non ancora in commercio, che permette un numero molto elevato di effetti particellari. Tuttavia è possibile animare le particelle con i metodi standard di Real 3D, anche se questo comporterà maggiore lavoro e una minore versatilità. In pratica dobbiamo ottenere l'animazione di un getto di particelle che sale dal basso verso l'alto, come le fiamme di un falò. Real 3D mette a disposizione il metodo CREATION per tale scopo. Al suo interno, come parametro, utilizzate una sfera primitiva. Essa rappresenta la particella-campione, non chiedetevi ora perché sia necessaria proprio una sfera: lo scoprirete più tardi. Assegnatele una velocità iniziale diretta verso l'alto, in modo che il metodo PROCESSOR, posto allo stesso livello di CREATION, possa muovere tutte le particelle appena create. Si osservi che per avere un effetto più realistico sarebbe opportuno disporre di particelle (sfere) di vari diametri: per tale motivo potreste usare due o tre metodi CREATION, che partano dallo stesso punto nello spazio, ognuno dei quali emette sfere di diametro diverso (Questo problema si risolve facilmente con un solo metodo VOLCAN se si usa la plug-in Phenomena). Ricordate che non servono migliaia di sfere per il nostro tipo di animazione particellare: come potete vedere dalle illustrazioni di queste pagine, sono sufficienti dieci o massimo venti sfere per ottenere l'effetto desiderato. Tuttavia è bene osservare che le sfere devono essere di dimensioni tali da sovrapporsi e compenetrarsi a vicenda, come un mucchietto di bolle di sapone. Dato che è sufficiente un numero esiguo di particelle, e dato che tali particelle sono costituite da primitive CSG (la sfera, in particolare, viene renderizzata molto velocemente da Real 3D), è ovvio che i tempi di calcolo dei singoli fotogrammi saranno piuttosto brevi, con nostra grande soddisfazione. Ricordate che dovete porre un limite alla durata massima delle particelle: ciò si ottiene intervenendo su un apposito parametro del metodo CREATION. Se non si operasse in tal senso, le fiamme si prolungherebbero indefinitamente verso il cielo, mentre ponendo un limite alla vita delle particelle, esse "si spengono" quando raggiungono una certa altezza. Pertanto, più breve è la vita delle particelle, più basse sono le fiamme. Eseguite una prova in wireframe di questa semplice animazione: dovreste ottenere un getto di sfere che sale (non troppo rapidamente) dalla base del fuoco e che si dissolve in aria dopo un breve tragitto. Noi abbiamo impiegato un metodo specifico della plug-in PHENOMENA per disturbare un poco il movimento delle particelle mentre salgono verso il cielo, mediante la turbolenza frattale del metodo BROWNIAN. Anche i lettori possono ottenere qualcosa di simile con il metodo TURBOLENCE della dotazione standard di Real 3D, ma noi abbiamo riscontrato che tale metodo richiede una laboriosa messa a punto, spesso non ricompensata dalla qualità del risultato; d'altra parte constaterete in seguito che non è del tutto necessario applicare la turbolenza frattale al moto delle particelle per ottenere una simulazione realistica.

Il rendering delle particelle

Eseguite il rendering di un fotogramma qualsiasi: osserverete che per ora le particelle vengono visualizzate (com'è lecito aspettarsi) sottoforma di normalissime sfere primitive, con tanto di superficie bianca e solida. Dimentichiamo per un attimo il problema dell'animazione, ed interveniamo coi nostri esperimenti sul getto di particelle "congelato" ad un certo fotogramma, come fosse un oggetto statico. Provate quindi a selezionare le sfere in basso e ad assegnare loro un colore giallo (si tratta della base della fiamma), poi selezionate quelle al centro e coloratele di rosso, infine selezionate quelle in cima ed assegnate loro un colore grigio chiaro (rappresenteranno il fumo). Ora intervenite sull'attributo "fade" con il menu "modify/properties/fade" in modo che le sfere in basso abbiano una trasparenza appena accennata (ad esempio"fade=50") e che tale valore di trasparenza aumenti gradualmente mano a mano che si sale verso la cima delle fiamme, cosicché le sfere più in alto abbiano all'incirca "fade=250". Ciò significa che le particelle alla base della fiamma avranno un colore giallo intenso, mentre le particelle color grigio, che rappresentano il fumo, saranno molto trasparenti. Si osservi che la trasparenza ottenuta mediante l'attributo "fade" viene calcolata molto rapidamente in fase di rendering, diversamente da quella che si ottiene creando un materiale di tipo vetroso, perché nel primo caso l'oggetto diventa semplicemente "traslucido", e si dissolve con lo sfondo, mentre nel secondo caso sono coinvolti parecchi calcoli di ray-tracing, con tanto di rifrazione e riflessione dei raggi luminosi. Infatti potrete apprezzare subito il rendering dalla velocità relativamente elevata e controllare allo stesso tempo se avete assegnato i valori corretti di colore e "fade" alle sfere. Dovreste ottenere un oggetto simile ad un mucchio di bolle di sapone di colore variabile dal giallo al grigio. Dato che in linea di massima l'oggetto "fuoco" non riceve né proietta ombre, selezionate tutta la gerarchia contenente le sfere, aprite la finestra "modify attributes", disattivate il flag "Cast Shadows" ed attivate "No shadows". Oltretutto questo accorgimento migliorerà parecchio i tempi di rendering. Ora create un materiale, poniamo il caso che lo chiamiate "fuoco_mat", ed attivate semplicemente il gadget "Unshaded" (poi ovviamente applicatelo a tutta la gerarchia delle particelle come "default mapping"). Questo significa che le particelle non risentiranno dell'illuminazione locale, bensì verranno renderizzate col loro colore di base, ed in maniera uniforme. Infatti, eseguendo un rendering di prova, osserverete che tutte le sfere appariranno come tanti dischetti semitrasparenti, di colore giallo brillante alla base. Inoltre si perde l'aspetto "solido" delle particelle sferiche, che a questo punto sembrano piuttosto tante nuvolette rotonde di vapore giallo, rosso e grigio. Siamo prossimi al risultato definitivo, ma serve ancora un accorgimento essenziale..

Magia del clip mapping...

Disegnate un brush bicolore a chiazze bianche e nere, come quello raffigurato in queste pagine. Editate il materiale "fuoco_mat" ed assegnate tale brush come texture per la mappatura. Attivate il flag "Clip map" e disattivate "Color map", poi attivate "Transp.color". Questo significa che questo materiale ritaglia le superfici sulle quali è proiettato, mantenendo le parti corrispondenti alle macchie bianche del brush, e rendendo del tutto invisibili le parti corrispondenti alle macchie nere. Ricordate di attivare anche "Unshaded". Ora applicate di nuovo questo materiale alla gerarchia che contiene tutte le particelle, ma questa volta usate la modalità "parallel mapping", dato che si tratta di proiettare la clip-map. Definite un rettangolo di proiezione grande all'incirca come il falò, prestando attenzione che le "macchie" disegnate nel brush non siano né troppo grosse né troppo piccole rispetto alla dimensione delle sfere sulle quali verranno proiettate. Eseguiteun rendering: ora notiamo che il grappolo di sfere ha cambiato decisamente aspetto! Infatti la "clip map" ha ritagliato le superfici delle particelle in maniera caotica, conferendo loro un'aspetto frastagliato. Se avete indovinato il giusto compromesso fra densità di particelle e dimensione delle chiazze, l'effetto finale dovrebbe essere piuttosto convincente. Inoltre dovrebbe essere difficile ravvisare al primo colpo d'occhio la natura "sferica" delle particelle, mentre si dovrebbe percepire il tutto come come un'unica forma di aspetto frattale, simile alle fiamme di un vero fuoco. Il tocco finale consiste nell'applicazione dell'effetto "GLOW", ovvero nella creazione di un alone luminoso che circondi le fiamme e che sottolinei il bagliore delle zone più calde. Per fare questo, editate il solito materiale "fuoco_mat" ed innalzate entrambe i valori di "Glow radius" e di "Glow effect" fino ad 80 circa. Attenzione: perché quest'effetto sia visibile nel rendering finale, è necessario che sia caricato in memoria il modulo di postprocessing "PPGlow"; la qual cosa si ottiene attivando la finestra per i settaggi del rendering, premendo il pulsante "postprocessing" e selezionando "Glow" nella lista dei filtri disponibili. Per un risultato di sicuro effetto, selezionate "addictive" e "fixed size" fra i parametri di funzionamento di questo filtro. Ora potete eseguire il rendering definitivo, sicuri della qualità del risultato, magari ponendo una sorgente luminosa color arancione all'interno del getto di particelle, in modo da simulare l'illuminazione del pavimento da parte del fuoco. Avvertenze per il rendering: utilizzate uno sfondo scuro, per apprezzare meglio il fumo, ed attivate la modalità Normal o Shadowless. Si rammenti che il filtro "glow" richiede molta RAM in caso di immagini di grande dimensione: nel caso dobbiate eseguire rendering in risoluzione parecchio elevata per i quali la memoria si dimostri insufficiente, può essere opportuno il ricorso all'espediente del calcolo a mosaico, mediante la funzione "autobox rendering".

Rendering dell'animazione

Da un lato abbiamo visto come creare il getto di particelle, e dall'altra abbiamo escogitato un sistema per il rendering realistico delle particelle, ma in un singolo fotogramma. Infatti qualcuno può obiettare che dovremmo intervenire manualmente per modificare il colore e al dissolvenza ("fade") delle particelle ad ogni fotogramma dell'animazione, e la cosa si dimostrerebbe presto insostenibile. Ebbene: grazie alla plug-in PHENOMENA abbiamo risolto in pochi secondo questo problema, dato che viene fornito un metodo, chiamato HISTORY, che permette di definire il cambiamento di colore, trasparenza, alpha channel, etc., di ogni particella durante la sua vita. Quindi le particelle diventano automaticamente e gradualmente gialle, arancioni, rosse e grigie man mano che invecchiano, diventando al contempo sempre più trasparenti fino a scomparire. Tuttavia anche i lettori, sprovvisti della beta version di Phenomena, possono ottenere un risultato simile con un accorgimento meno elegante, ma pur sempre adeguato allo scopo: basta preparare un brush con un gradiente variabile dal giallo al rosso al grigio, poi lo si applica come "color map" all'intera gerarchia con l'animazione. Per quanto concerne il cambiamento dell'attributo "fade", non esistono purtroppo soluzioni equivalenti, e la strada più semplice consiste nell'accontentarsi di un valore di "fade" costante (ad esempio 120). Una volta sistemati questi ultimi dettagli, è possibile eseguire il rendering dell'intera animazione, sicuri di ottenere per ogni fotogramma la visualizzazione delle particelle a mò di fiamme. Vi assicuriamo che l'effetto in animazione è ancora più realistico di quello che ci si potrebbe aspettare dalla visione di un'immagine statica. Si noti che l'aver applicato una clip-map statica alle particelle in movimento può produrre un effetto antiestetico in fase di rendering, pertanto sarebbe corretto disporre di un certo numero di clip-map diverse, da applicare in sequenza. Noi abbiamo creato una sequenza di brush grazie ad una texture algoritmica, da noi scritta in linguaggio RPL. In pratica, i brush usati per il clip map non sono altro che il risultato di una dozzina di rendering di Real 3D, nei quali si vede un piano nero con macchie bianche che "si muovono" fondendosi e dividendosi. Questa non è la sede per trattare il procedimento col quale siamo arrivati alla serie dei brush con le "macchie animate", ma ricordiamo solamente come operare per eseguire il clip mapping di una sequenza animata: supponiamo abbiate già disponibili 15 diversi brush che formano l'animazione delle macchie, ad esempio ordinati in una directory coi nomi "brush1", "brush2", "brush3" etc. Nel materiale "fuoco_mat" indicate "brush%d" come nome generico, poi attivate l'"index handler: Ping Pong" ed inserite 15 come valore "b". In questo modo le macchie si muoveranno durante l'animazione. Una soluzione più semplice potrebbe consistere nell'uso di un unico semplice brush di clip-mapping, laddove il suo rettangolo di proiezione viene gradualmente spostato verso il basso (mediante un metodo PATH) durante il corso dell'animazione.

Per finire...

E' possibile apportare numerosi miglioramenti a questo tipo di animazione, ad esempio usando un ulteriore metodo CREATION che "lanci" anche alcune deboli sorgenti luminose verso l'alto, insieme alle sfere, per simulare con maggior realismo l'illuminazione che il fuoco produce sugli oggetti circostanti; infatti in Real 3D qualsiasi oggetto può essere considerato particella. perfino le sorgenti luminose. Noi abbiamo sperimentato alcuni effetti davvero incredibili, grazie alla beta-release della plug-in Phenomena: ad esempio abbiamo utilizzato il metodo FAN per simulare, mediante un ventilatore, l'effetto del vento sulle fiamme, poi abbiamo usato FLOW in modo da mettere una pentola sul fuoco ed ottenere autoimaticamente l'effetto per il quale le fiamme "avvolgono" il contenitore, che dondola appeso ad un filo. Inoltre sarebbe possibile utilizzare il metodo STARTER per accendere e spegnere il fuoco con getti d'acqua, etc. In teoria con una buona conoscenza dell'RPL, e con molta pazienza, è possibile giungere a questi esempi estremi anche senza possedere Phenomena. Arrivederci alla prossima puntata!


  • Enigma Amiga Run Main Page

  • Enigma Amiga Run Contributors

  • Michele Iurillo Home Page

  • Our related links


  • Copyright Enigma Amiga Run - Enigma Amiga Run it's a G.R.Edizioni publications - for contact us mailto yuri@skylink.it